# -*- coding: utf-8 -*-
# @Time    : 2024/1/11  14:42
# @Author  : zhanghao
# @FileName: worker.py
# @Software: PyCharm
"""
    Description: 任务分配者
"""
from multiprocessing import Pipe
from threading import Thread

from api.domain.file_result import FileResult
from domain.signal_unit import SignalUnit
from config.logger import Logger
from helper.event_type import EventType
from db.sqlite import Sqlite

import os
import time
import datetime


class Master(Thread):

    logger = Logger.get()

    # 信号-用于主线程更新主界面
    conn_main: Pipe
    sqlite: Sqlite

    def __init__(self, conn_main):
        super().__init__()
        self.sqlite = Sqlite()
        self.conn_main = conn_main

    def run(self) -> None:
        self.logger.info(str(os.getpid()) + 'master 开始分配任务......')
        self.taskDistribute()

    def sendTask(self, task):
        file_task = FileResult.build(task[0], task[1], task[2], task[3], task[4], task[5],
                                     task[6], task[7], task[8], task[9])
        if file_task.task_status == 1:
            self.logger.info('task正在运行中，id=' + str(file_task.id))
            return

        # 任务开始-更新任务状态
        file_task.task_status = 1
        file_task.appendInfo('first_execute_time', datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
        file_task.appendInfo('execute_start_time', datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
        self.sqlite.updateTask(file_task)

        event = SignalUnit.build(EventType.START_PROCESS, file_task)
        self.logger.info('master 分配任务: ' + str(file_task))
        self.logger.info('master 分配任务，编号id=' + str(file_task.id))
        self.conn_main.send(event)

    # 核心分配任务
    def taskDistribute(self):
        while True:
            try:
                # 每次都查找10个任务
                task_data = self.sqlite.query10Task()
                if len(task_data) > 0:
                    self.logger.info('任务开始分配，任务数量：' + str(len(task_data)))
                    # 先发送3个任务
                    idx = 0
                    for task in task_data:
                        self.sendTask(task)

                        idx += 1
                        if idx == 3 or idx >= len(task_data):
                            break

                    self.logger.info(str(idx) + '个任务开始分配完成：' + str(len(task_data)))
                    for task_id in range(len(task_data)):
                        if task_id < idx - 1:
                            continue

                        self.logger.info('master 开始接收任务结果, id=' + str(idx))
                        recv_data = self.conn_main.recv()
                        self.logger.info('master 开始接收任务结果: ' + str(recv_data))

                        if task_id < len(task_data) - 1:
                            task = task_data[task_id]
                            self.sendTask(task)
            except Exception as e:
                self.logger.exception('未知异常：', e)

            finally:
                # 任务完成后，等待5秒
                time.sleep(5)
